# -*- coding:utf-8 -*-
# @Desc: 
# @Author: Administrator
# @DateTime: 2020/10/16 12:10


# import numpy as np
import numpy

### numpy的切片操作与Python中的列表操作一样
# 索引 注: 数组的索引是从0开始;最后位置的索引为-1
# 切片 注: array[index:end:step] ---> 数组[起始下标:结束下标:步长(间隔)];间隔默认为1
# 切片 注: end > index;step为正数(正的数),step为负数(倒着数)
# 切片 注: 如果index没有数值,表示从0开始取,如果end没有数值,表示取到最后一个
# 切片 注: 如果end给定了数值,取得是起始下标位置到end-1下标位置的元素


### 一维数组的索引与切片操作
# arr = numpy.arange(12)  # [ 0  1  2  3  4  5  6  7  8  9 10 11]
## 索引操作: 获取的是一维数组中的元素数据
# print(arr[0])   # 获取数组的第1个元素,即索引为1
# print(arr[-1])  # 获取数组的最后1个元素,即索引为-1

## 切片操作: [:]代表某个维度的数据 ---> [起始索引:结束索引:步长]
# print(arr[1:5])     # 获取数组第2个元素到第(5-1)个的元素数组
# print(arr[:3])      # 获取数组第1个元素(即开始元素)到第(3-1)个的元素数组
# print(arr[5:])      # 获取数组第6个元素到最后一个的元素数组
# print(arr[3:10:2])  # 获取数组第4个元素到第(10-1)个的元素,并且步长为2的元素数组

print("---------------------------------------------------------------")

### 二维数组的索引与切片操作
arr = numpy.arange(24).reshape((4,6))
# [[ 0  1  2  3  4  5][ 6  7  8  9 10 11][12 13 14 15 16 17][18 19 20 21 22 23]]
## 索引操作: 获取的是二维数组中的行数据
# print(arr[0])   # 获取数组的第1个元素,即索引为1
# print(arr[-1])  # 获取数组的最后1个元素,即索引为-1

## 切片操作: [:]代表某个维度的数据 ---> [行起始索引:行结束索引:行步长, 列起始索引:列结束索引:列步长]
print(arr[2])         # 取某个行位置:获取第3行的数据
print(arr[2:])        # 取连续的多行的位置:获取第3行及往后的所有数据
print(arr[[0,3]])     # 取不连续的多行位置:获取第1,4行的数据
print(arr[0,3])       # 根据索引取单行和单列的位置:获取第1行数据的第4列元素
print(arr[0:2, 1:4])  # 取多行和多列的位置:获取第1,2行的第2,3,4列的元素数组
# 取行和列不相邻的值:
print(arr[[0,1,3], [2,3,4]])  # (0,2) (1,3) (3,4) 即第1行第3列,第2行第4列,第4行第5列

print("---------------------------------------------------------------")

### 三维数组的索引与切片操作
# arr = numpy.arange(24).reshape((2,3,4))
# [[[ 0  1  2  3][ 4  5  6  7][ 8  9 10 11]] [[12 13 14 15][16 17 18 19][20 21 22 23]]]
## 索引操作: 获取的是三维数组中的块数据
# print(arr[0])   # 获取数组的第1个元素,即索引为1
# print(arr[-1])  # 获取数组的最后1个元素,即索引为-1

## 切片操作: [:]代表某个维度的数据 ---> [块起始索引:块结束索引:块步长, 行起始索引:行结束索引:行步长, 列起始索引:列结束索引:列步长]
# print(arr[0:1, 1:2, 1:3])  # 获取第1块的第2个元素数组的第2,3个元素数据


### numpy中条件索引进行值修改
# 注意: 多个条件组合要使用 & | 连接，而不是Python的 and or
## 布尔索引示例: 把数组中小于10的替换为10
arr = numpy.arange(12).reshape(3,4)  # [[ 0  1  2  3][ 4  5  6  7][ 8  9 10 11]]
arr[arr < 10] = 10  # 把数组中小于10的数字替换为10
print(arr)  # [[ 10  10  10  10][ 10  10  10  10][ 10  10 10 11]]

## 三元运算符示例: 把数组中小于10的数字替换为10,把大于10的替换为20
arr = numpy.arange(12).reshape(3,4)  # [[ 0  1  2  3][ 4  5  6  7][ 8  9 10 11]]
arr = numpy.where(arr <= 10, 10, 20)
print(arr)  # [[10 10 10 10][10 10 10 10][10 10 10 20]]

## 裁剪示例: 把数组中小于5的替换为5,把大于10的替换为10
arr = numpy.arange(12).reshape(3,4)  # [[ 0  1  2  3][ 4  5  6  7][ 8  9 10 11]]
print(arr.clip(5,10))  # [[ 5  5  5  5][ 5  5  6  7][ 8  9 10 10]]

